<?php

namespace app\index\controller;

use gmars\rbac\Rbac;
use think\Controller;
use think\Db;
use think\Request;
use extend\REST;
use extend\Smtp;
use think\Session;
use app\index\validate\loginValidate;
use Yurun\OAuthLogin\QQ\OAuth2;

class Index extends Controller
{
    /**首页
     * @return string
     */
    public function index()
    {

        $rbac = new Rbac();
//        $rbac->createTable();
//        $rbac->savePermissionCategory([
//            'name' => '用户管理组',
//            'description' => '网站用户的管理',
//            'status' => 1
//        ]);


//        dump($rbac);
        return view('index/index');
    }

    /**登录
     * @return \think\response\View
     */
    public function login()
    {
        $token = $this->request->token('__token__', 'sha1');
        Session::set('token', [
            'token' => $token
        ]);

        return view('login/index', [
                'token' => $token,]
        );
    }

    /**
     *手机 注册页面
     * @return \think\response\View
     */
    public function register()
    {
        return view('login/register');
    }

    /**
     * 执行注册
     *
     */
    public function doregister(Request $request)
    {
        $post = $request->post();
        if (empty($post['mobile']) || empty($post['password']) || empty($post['rpassword']) || empty($post['code'])) {
            dump($post['mobile']);
            dump($post['password']);
            dump($post['rpassword']);
            dump($post['code']);
//            return $this->error('不能为空');
        }
        if ($a = strlen($post['mobile']) !== 11) {
            return $this->error('手机号码有误');
        }
        $onlyTel = $this->findTel($post['mobile']);
        if ($onlyTel !== null) {
//            dump($onlyTel);die;
            return $this->error('手机号码重复');
        }
        if ($post['password'] !== $post['rpassword']) {
            return $this->error('两次密码不一致');
        }

        if (empty(Session::get('code'))) {
            return $this->error('验证码不对');
        }

        $session_code = Session::get('code');
        if (intval($post['code']) !== $session_code) {
            return $this->error('验证码不对!!!');
        }
        $data = [
            'mobile' => $post['mobile'],
            'password' => md5($post['rpassword']),
        ];


//        // 引入验证器
        $vali = new loginValidate();
        $result = $vali->goCheck($data);
        // dump($result);die;
        if ($result !== true) {
            return $this->error($result);
        }

        $rows = Db::name('user')
            ->insert($data);
        if ($rows == 1) {
            return $this->success('注册成功', url('index/index/index'));
        }
    }


    /**
     * mobile重复查询
     * @param $mobile
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function findTel($mobile)
    {
        $rows = Db::name('user')
            ->where('mobile', $mobile)
            ->find();
        return $rows;
    }


    /**邮箱注册
     * @return \think\response\View
     */
    public function email()
    {

        return view('login/email');
    }

    /**短信验证
     * @param $mobile
     * @return bool|\extend\stdClass|mixed|\SimpleXMLElement
     */
    public function send($mobile)
    {
        $data = [
            'codenum' => '1'
        ];
        //查找数据库有没有这个mobile(接受验证码的手机  有就update  没有就add
        $issetTel = $this->issetTel($mobile);
        if ($issetTel == null) {
            $res = Db::name('mobile_code')
                ->where('mobile', $mobile)
                ->insert($data);
        } else {
            $codenum['codenum'] = $this->getUserCodeNum($mobile);
            if ($codenum['codenum']['codenum'] == 5) {
                //验证码字数到5  add  限制时间为当前时间
                //第二天发短信 检测当前时间 >=  time +24h    若>则 清空 次数
                $time = [
                    'time' => time()
                ];
                Db::name('mobile_code')
                    ->where('mobile', $mobile)
                    ->update($time);
                return $this->error('当日验证码次数超过限制!!!');
            }
            $res = Db::name('mobile_code')
                ->where('mobile', $mobile)
                ->setInc('codenum');
        }

        //每次发送验证码之前 查询mobile_code time 时间 为 空  直接发送
//        有 time 则  time+24h  >=  time()当前时间   发送    否则 限制时间未到 不发
        $mobiletime = Db::name('mobile_code')
            ->where('mobile', $mobile)
            ->find('codenum');

        if ($mobiletime == '') {
            //  验证码  一会用于验证
            $yzm = mt_rand(1000, 9999);
            Session::set('code', $yzm);
            $data2 = [$yzm, 10];
            $result = $this->sendSMS($mobile, $data2, 1);
            return $result;

        }
        $newtime = time() + 60 * 60 * 24;
        if ($mobiletime >= $newtime) {
            //24h限制过期 直接清空
            $ptime = [
                'codenum' => '',
            ];
            Db::name('mobile_code')
                ->where('mobile', $mobile)
                ->update($ptime);

            //  验证码  一会用于验证
            $yzm = mt_rand(1000, 9999);
            Session::set('code', $yzm);
            $data2 = [$yzm, 10];
            $result = $this->sendSMS($mobile, $data2, 1);
            return $result;
        }
    }

    /***
     * 数据库 零时的验证码表 是否有mobile 存在
     * @param $mobile
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    function issetTel($mobile)
    {
        $rows = Db::name('mobile_code')
            ->where('mobile', $mobile)
            ->find();
        return $rows;
    }


    /**
     * 获取该用户 今日发送验证码次数
     * @param $mobile
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    function getUserCodeNum($mobile)
    {
        $rows = Db::name('mobile_code')
            ->field('codenum')
            ->where('mobile', $mobile)
            ->find();
        return $rows;
    }


    /**
     * 发送模板短信
     * @param to 手机号码集合,用英文逗号分开
     * @param datas 内容数据 格式为数组 例如：array('Marry','Alon')，如不需替换请填 null
     * @param $tempId 模板Id, 默认用 id = 1
     */
    function sendSMS($to, $datas, $tempId)
    {
        // 初始化REST SDK
        $rest = new REST('app.cloopen.com', '8883', '2013-12-26');
        $rest->setAccount('8a216da86a58af8b016a8d0a72981bf0', '82ffeebed9bd43998c0429aebe68c8d3');
        $rest->setAppId('8a216da86a58af8b016a8d0a72eb1bf7');
        // 发送模板短信
        $result = $rest->sendTemplateSMS($to, $datas, 1);
        if ($result == NULL) {
            return false;
        }
        return $result;
//        if ($result->statusCode != 0) {
//            //TODO 添加错误处理逻辑
//            return $result;
//        } else {
//            //TODO 添加成功处理逻辑
//            return $result;
//        }
    }

    /**执行登录
     * @param $mobile
     * @param $password
     */
    public function dologin(Request $request)
    {
// 接受登录数据
        $data = $request->post();
        //加密密码
        $data['password'] = md5($data['password']);
//        dump($data);die;
        //如果输入中包含@,则使用邮箱登录验证
        if (preg_match('/^.*@.*$/', $data['name']) == 1) {
            $data['email'] = $data['name'];
            $result = $this->findUserByEmail($data);
            //如果输入中为11个数字, 使用手机登录验证
        } else if (preg_match('/^\d{11}$/', $data['name']) == 1) {
            $data['mobile'] = $data['name'];
            $result = $this->findUserByTel($data);
            //否则, 使用用户名登录验证
        }
        $session_token = Session::get()['token']['token'];
        if ($session_token !== $data['__token__']) {
            return $this->error('登录失败请重试');
        }

//        // 引入验证器
//        $vali = new updateValidate();
//        $result = $vali->goCheck($data);


        if ($result > 0) {
            $this->success('登录成功', url('index/index/index'));
        }
        $this->error('账号不存在');
    }

    public function findUserByEmail($data)
    {
        $result = Db::name('user')
            ->where(['email' => $data['email'], 'password' => $data['password']])
            ->find();
        return $result;
    }

    public function findUserByTel($data)
    {
        $result = Db::name('user')
            ->where(['mobile' => $data['mobile'], 'password' => $data['password']])
            ->find();
        return $result;
    }


    /**
     * 邮箱执行注册
     */
    public function sendmail($mail)
    {
        $transport = new \Swift_SmtpTransport('smtp.163.com', 465, 'ssl'); // 邮箱服务器
        $transport->setUsername('xukai981230@163.com')  // 邮箱用户名
        ->setPassword('qq765229854');   // 邮箱密码，有的邮件服务器是授权码
        $code = mt_rand(1000, 9999);
        Session::set('code', $code);
        $mailer = new \Swift_Mailer($transport);
        $message = (new \Swift_Message('您的验证码如下:' . $code)) // 邮件标题
        ->setFrom(['xukai981230@163.com' => 'xxx有限责任公司']) // 发送者
        ->setTo([$mail => '用户']) //发送对象，数组形式支持多个
        ->setBody($code); //邮件内容
        $result = $mailer->send($message);
        return $result;

    }

    /**执行邮箱注册
     * @param $mobile
     * @param $password
     */
    public function doemail(Request $request)
    {
        $post = $request->post();
        $session_emailCode = Session::get('emailCode');
        if (intval($post['emailCode']) !== $session_emailCode) {
            return $this->error('验证码不对');
        }
        if ($post['password'] !== $post['rpassword']) {
            return $this->error('两次密码不一致');
        }
        if (empty($post['email']) || empty($post['password']) || empty($post['rpassword']) || empty($post['emailCode'])) {
            return $this->error('不能为空');
        }
        $onlyemail = $this->findEmail($post['email']);
        if ($onlyemail !== null) {
//            dump($onlyTel);die;
            return $this->error('邮箱重复');
        }
        $data = [
            'email' => $post['email'],
            'password' => md5($post['rpassword'])
        ];
        //        // 引入验证器
        $vali = new loginValidate();
        $result = $vali->goCheck($data);
        // dump($result);die;
        if ($result !== true) {
            return $this->error($result);
        }
//        dump($post);
//        die;
        $rows = Db::name('user')
            ->insert($data);
        if ($rows == 1) {
            return $this->success('注册成功', url('index/index/index'));
        }

    }

    /**找重复的email
     * @param $email
     * @return array|false|\PDOStatement|string|\think\Model
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function findEmail($email)
    {
        $rows = Db::name('user')
            ->where('email', $email)
            ->find();
        return $rows;
    }

    public function qqlogin()
    {
        include './function.php';
// Step2：获取Authorization Code

        $code = $_GET['code'];

// Step3：通过Authorization Code获取Access Token
        $url = 'https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101782385&client_secret=b37ace01eb52b5d8134b24bfd38ac7fa&code=' . $code . '&redirect_uri=http://www.xukai1998.top/mycb';
        $res = https_request($url);

// var_dump($res);

// 返回的数据
// access_token=YOUR_ACCESS_TOKEN&expires_in=3600

// 切割字符串 获取access_token
        $res = explode('&', $res);
        $res = explode('=', $res[0]);

        $access_token = $res[1];


// Step4：使用Access Token来获取用户的OpenID

        $openid_url = 'https://graph.qq.com/oauth2.0/me?access_token=' . $access_token;

        $openid = https_request($url);

        var_dump($openid);

// 获取返回包 获取opendi
// 'callback( {“client_id”:”YOUR_APPID”,”openid”:”YOUR_OPENID”} )';
        if (strpos($openid, "callback") !== false) {
            $lpos = strpos($openid, "(");
            $rpos = strrpos($openid, ")");
            $openid = substr($openid, $lpos + 1, $rpos - $lpos - 1);
        }
        $user = json_decode($openid, true);
        $openid_info = $user['openid'];

// $userinfo = 'Step5：使用Access Token以及OpenID来访问和修改用户数据'

// 获取用户信息
        $userinfo_url = 'https://graph.qq.com/user/get_user_info?access_token=' . $access_token . '&oauth_consumer_key=你的key&openid=' . $openid_info;
        $userinfo = https_request($userinfo_url);

        var_dump($userinfo);
    }

}

